/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gmovil_jpa.controladores;

import gmovil_jpa.controladores.exceptions.NonexistentEntityException;
import gmovil_jpa.entidades.DetalleFacturaArticulo;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import gmovil_jpa.entidades.Articulo;
import gmovil_jpa.entidades.TipoOperacionComercial;
import gmovil_jpa.entidades.Factura;

/**
 *
 * @author castlerock
 */
public class DetalleFacturaArticuloJpaController {

    public DetalleFacturaArticuloJpaController() {
        emf = Persistence.createEntityManagerFactory("gmovil_jpaPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(DetalleFacturaArticulo detalleFacturaArticulo) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Articulo articulo = detalleFacturaArticulo.getArticulo();
            if (articulo != null) {
                articulo = em.getReference(articulo.getClass(), articulo.getIdArticulo());
                detalleFacturaArticulo.setArticulo(articulo);
            }
            TipoOperacionComercial tipoOperacionComercial = detalleFacturaArticulo.getTipoOperacionComercial();
            if (tipoOperacionComercial != null) {
                tipoOperacionComercial = em.getReference(tipoOperacionComercial.getClass(), tipoOperacionComercial.getIdTipoOperacionComercial());
                detalleFacturaArticulo.setTipoOperacionComercial(tipoOperacionComercial);
            }
            Factura factura = detalleFacturaArticulo.getFactura();
            if (factura != null) {
                factura = em.getReference(factura.getClass(), factura.getIdFactura());
                detalleFacturaArticulo.setFactura(factura);
            }
            em.persist(detalleFacturaArticulo);
            if (articulo != null) {
                articulo.getDetalleFacturaArticuloList().add(detalleFacturaArticulo);
                articulo = em.merge(articulo);
            }
            if (tipoOperacionComercial != null) {
                tipoOperacionComercial.getDetalleFacturaArticuloList().add(detalleFacturaArticulo);
                tipoOperacionComercial = em.merge(tipoOperacionComercial);
            }
            if (factura != null) {
                factura.getDetalleFacturaArticuloList().add(detalleFacturaArticulo);
                factura = em.merge(factura);
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(DetalleFacturaArticulo detalleFacturaArticulo) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleFacturaArticulo persistentDetalleFacturaArticulo = em.find(DetalleFacturaArticulo.class, detalleFacturaArticulo.getIdDetalleFacturaArticulo());
            Articulo articuloOld = persistentDetalleFacturaArticulo.getArticulo();
            Articulo articuloNew = detalleFacturaArticulo.getArticulo();
            TipoOperacionComercial tipoOperacionComercialOld = persistentDetalleFacturaArticulo.getTipoOperacionComercial();
            TipoOperacionComercial tipoOperacionComercialNew = detalleFacturaArticulo.getTipoOperacionComercial();
            Factura facturaOld = persistentDetalleFacturaArticulo.getFactura();
            Factura facturaNew = detalleFacturaArticulo.getFactura();
            if (articuloNew != null) {
                articuloNew = em.getReference(articuloNew.getClass(), articuloNew.getIdArticulo());
                detalleFacturaArticulo.setArticulo(articuloNew);
            }
            if (tipoOperacionComercialNew != null) {
                tipoOperacionComercialNew = em.getReference(tipoOperacionComercialNew.getClass(), tipoOperacionComercialNew.getIdTipoOperacionComercial());
                detalleFacturaArticulo.setTipoOperacionComercial(tipoOperacionComercialNew);
            }
            if (facturaNew != null) {
                facturaNew = em.getReference(facturaNew.getClass(), facturaNew.getIdFactura());
                detalleFacturaArticulo.setFactura(facturaNew);
            }
            detalleFacturaArticulo = em.merge(detalleFacturaArticulo);
            if (articuloOld != null && !articuloOld.equals(articuloNew)) {
                articuloOld.getDetalleFacturaArticuloList().remove(detalleFacturaArticulo);
                articuloOld = em.merge(articuloOld);
            }
            if (articuloNew != null && !articuloNew.equals(articuloOld)) {
                articuloNew.getDetalleFacturaArticuloList().add(detalleFacturaArticulo);
                articuloNew = em.merge(articuloNew);
            }
            if (tipoOperacionComercialOld != null && !tipoOperacionComercialOld.equals(tipoOperacionComercialNew)) {
                tipoOperacionComercialOld.getDetalleFacturaArticuloList().remove(detalleFacturaArticulo);
                tipoOperacionComercialOld = em.merge(tipoOperacionComercialOld);
            }
            if (tipoOperacionComercialNew != null && !tipoOperacionComercialNew.equals(tipoOperacionComercialOld)) {
                tipoOperacionComercialNew.getDetalleFacturaArticuloList().add(detalleFacturaArticulo);
                tipoOperacionComercialNew = em.merge(tipoOperacionComercialNew);
            }
            if (facturaOld != null && !facturaOld.equals(facturaNew)) {
                facturaOld.getDetalleFacturaArticuloList().remove(detalleFacturaArticulo);
                facturaOld = em.merge(facturaOld);
            }
            if (facturaNew != null && !facturaNew.equals(facturaOld)) {
                facturaNew.getDetalleFacturaArticuloList().add(detalleFacturaArticulo);
                facturaNew = em.merge(facturaNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = detalleFacturaArticulo.getIdDetalleFacturaArticulo();
                if (findDetalleFacturaArticulo(id) == null) {
                    throw new NonexistentEntityException("The detalleFacturaArticulo with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleFacturaArticulo detalleFacturaArticulo;
            try {
                detalleFacturaArticulo = em.getReference(DetalleFacturaArticulo.class, id);
                detalleFacturaArticulo.getIdDetalleFacturaArticulo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The detalleFacturaArticulo with id " + id + " no longer exists.", enfe);
            }
            Articulo articulo = detalleFacturaArticulo.getArticulo();
            if (articulo != null) {
                articulo.getDetalleFacturaArticuloList().remove(detalleFacturaArticulo);
                articulo = em.merge(articulo);
            }
            TipoOperacionComercial tipoOperacionComercial = detalleFacturaArticulo.getTipoOperacionComercial();
            if (tipoOperacionComercial != null) {
                tipoOperacionComercial.getDetalleFacturaArticuloList().remove(detalleFacturaArticulo);
                tipoOperacionComercial = em.merge(tipoOperacionComercial);
            }
            Factura factura = detalleFacturaArticulo.getFactura();
            if (factura != null) {
                factura.getDetalleFacturaArticuloList().remove(detalleFacturaArticulo);
                factura = em.merge(factura);
            }
            em.remove(detalleFacturaArticulo);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<DetalleFacturaArticulo> findDetalleFacturaArticuloEntities() {
        return findDetalleFacturaArticuloEntities(true, -1, -1);
    }

    public List<DetalleFacturaArticulo> findDetalleFacturaArticuloEntities(int maxResults, int firstResult) {
        return findDetalleFacturaArticuloEntities(false, maxResults, firstResult);
    }

    private List<DetalleFacturaArticulo> findDetalleFacturaArticuloEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(DetalleFacturaArticulo.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public DetalleFacturaArticulo findDetalleFacturaArticulo(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(DetalleFacturaArticulo.class, id);
        } finally {
            em.close();
        }
    }

    public int getDetalleFacturaArticuloCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<DetalleFacturaArticulo> rt = cq.from(DetalleFacturaArticulo.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
